home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 102_01 / bugs.c < prev    next >
Text File  |  1984-02-10  |  8KB  |  350 lines

  1.  
  2. /*
  3.     "Bugs"
  4.     written by Steve Ward for the H19/H89 display terminal
  5.  
  6.     BD says..."This one is WIERD!!!"
  7.     Usage:
  8.         A>bugs [-[w][c]] [N] <cr>
  9.     where N sets number of bugs (up to NBUGS); c starts them
  10.     out at the center, and w puts up a wall around the screen
  11.     that bugs can't go through (except to come IN...so use -c
  12.     also if you want an integral wall)
  13. */
  14.  
  15. #define    NBUGS    25
  16. #define BOT    0
  17. #define LEFT    0
  18. #define RADIUS2    21
  19. #define CONTROL_C 3
  20. #define putchar(c) bios(4,c)
  21.  
  22. int    Top,        /* Pagesize-1                */
  23.     Right;        /* Linelength-2                */
  24.  
  25. struct bug {
  26.     int X,Y;
  27.     int Dir;    /* 0-down, 1-left, 2-up, 3-right.    */
  28.     int State; } bugs[NBUGS];
  29. char    Wflg, Cflg;
  30. int    CurX, CurY;
  31. int    CBugs;
  32. int    XMotion[20], YMotion[20];
  33.  
  34.  
  35. step(bb)
  36.     struct bug *bb;
  37.  {    switch ((*bb).State) {
  38.      case 0:    r(bb,1,0,' ');
  39.             r(bb,1,-1,'\\'); (*bb).State++; break;
  40.      case 1:    r(bb,-1,0,' ');
  41.             r(bb,-1,-1,'/');
  42.             (*bb).State++;    break;
  43.      case 2:    r(bb,1,1,' ');
  44.             r(bb,1,0,'\\');
  45.             (*bb).State++;    break;
  46.      case 3:    r(bb,-1,1,' ');
  47.             r(bb,-1,0,'/');
  48.             (*bb).State++;    break;
  49.      case 4:    r(bb,0,-1,'0');
  50.             r(bb,0,0,'O');
  51.             r(bb,1,-1,'/');
  52.             r(bb,-1,-1,'\\');
  53.             r(bb,1,0,'/');
  54.             r(bb,-1,0,'\\');
  55.             (*bb).State++;    break;
  56.      case 5:    r(bb,1,2,' ');
  57.             r(bb,1,1,'\\');
  58.             (*bb).State++;    break;
  59.      case 6:    r(bb,-1,2,' ');
  60.             r(bb,-1,1,'/');
  61.             (*bb).State++;    break;
  62.      case 7:    r(bb,1,1,'/');
  63.             r(bb,0,1,' ');
  64.             r(bb,-1,1,'\\');
  65.             switch (((*bb).Dir) & 03) {
  66.              case 0: (*bb).Y--; break;
  67.              case 2: (*bb).Y++; break;
  68.              case 1: (*bb).X++; break;
  69.              case 3: (*bb).X--; break; }
  70.             (*bb).State = 0;    break;
  71. /* Diagonal movement:                        */
  72.  
  73.     case 20:    r(bb,1,1,' ');
  74.             r(bb,1,0,'-');
  75.             (*bb).State++;    break;
  76.     case 21:    r(bb,-1,-1,' ');
  77.             r(bb,0,-1,'|');
  78.             (*bb).State++;    break;
  79.     case 22:    r(bb,0,1,' ');
  80.             r(bb,1,1,'/');
  81.             (*bb).State++;    break;
  82.     case 23:    r(bb,-1,0,' ');
  83.             r(bb,-1,-1,'/');
  84.             (*bb).State++;    break;
  85.     case 24:    r(bb,1,-1,'0');
  86.             r(bb,0,0,'O');
  87.             r(bb,1,1,' ');
  88.             r(bb,0,1,'|');
  89.             r(bb,-1,-1,' ');
  90.             r(bb,-1,0,'-');
  91.             r(bb,1,0,'|');
  92.             r(bb,0,-1,'-');
  93.             (*bb).State++;    break;
  94.     case 25:    r(bb,-1,2,' ');
  95.             r(bb,0,2,'/');
  96.             (*bb).State++;    break;
  97.     case 26:    r(bb,-2,1,' ');
  98.             r(bb,-2,0,'/');
  99.             (*bb).State++;    break;
  100.     case 27:    r(bb,-1,1,' ');
  101.             r(bb,0,2,' ');
  102.             r(bb,-2,0,' ');
  103.             r(bb,1,0,'|');
  104.             r(bb,0,-1,'-');
  105.             switch (((*bb).Dir)& 03) {
  106.              case 0: (*bb).X++; (*bb).Y--; break;
  107.              case 1: (*bb).X++; (*bb).Y++; break;
  108.              case 2: (*bb).X--; (*bb).Y++; break;
  109.              case 3: (*bb).X--; (*bb).Y--; break; }
  110.             (*bb).State = 20;    break;
  111.  
  112. /* turn from diag to orthogonal (45 deg CCW)                */
  113.  
  114.     case 40:    r(bb,-1,0,' ');
  115.             r(bb,-2,0,'/');
  116.             (*bb).State++; break;
  117.     case 41:    r(bb,-1,0,'O');
  118.             r(bb,-1,2,' ');
  119.             r(bb,-1,1,'|');
  120.             r(bb,-2,0,'\\');
  121.             r(bb,-2,1,'\\');
  122.             (*bb).State++; break;
  123.     case 42:    r(bb,1,1,' ');
  124.             r(bb,0,1,'\\');
  125.             r(bb,-1,1,'\\');
  126.             r(bb,-2,0,' ');
  127.             r(bb,-2,-1,'/');
  128.             r(bb,0,-1,'/');
  129.             (*bb).Dir = (((*bb).Dir)+1) & 03;
  130.             (*bb).State = 0; break;
  131.  
  132. /* Turn from ortho to diagonal:                    */
  133.  
  134.     case 50:    r(bb,-1,0,' ');
  135.             r(bb,-1,-1,'/');
  136.             (*bb).State++; break;
  137.     case 51:    r(bb,-1,1,' ');
  138.             r(bb,-1,0,'/');
  139.             (*bb).State++; break;
  140.     case 52:    r(bb,1,2,' ');
  141.             r(bb,0,1,'|');
  142.             r(bb,-1,1,'O');
  143.             r(bb,1,0,' ');
  144.             r(bb,-1,2,' ');
  145.             r(bb,0,2,'/');
  146.             r(bb,-1,0,' ');
  147.             r(bb,-2,0,'/');
  148.             r(bb,-2,1,'-');
  149.             (*bb).State++; break;
  150.     case 53:    r(bb,0,2,' ');
  151.             r(bb,-1,2,'|');
  152.             r(bb,-2,0,' ');
  153.             r(bb,-1,0,'-');
  154.             (*bb).Dir = (((*bb).Dir) | 04);
  155.             (*bb).State = 20; break; }
  156.  }
  157.  
  158.  
  159. mkbug(bb,xp,yp,direc)
  160.     struct bug (*bb);
  161.  {    (*bb).X = xp;
  162.     (*bb).Y = yp;
  163.     (*bb).State = 0;
  164.     (*bb).Dir = direc;
  165.  
  166.     if (direc<4) {
  167.      r(bb,0,0,'0');
  168.      r(bb,0,1,'O');
  169.      r(bb,1,0,'/');
  170.      r(bb,1,1,'/');
  171.      r(bb,1,2,'/');
  172.      r(bb,-1,2,'\\');
  173.      r(bb,-1,1,'\\');
  174.      r(bb,-1,0,'\\'); }
  175.     else {
  176.      (*bb).State = 20;
  177.      r(bb,0,0,'0');
  178.      r(bb,1,1,'/');
  179.      r(bb,-1,-1,'/');
  180.      r(bb,0,1,'|');
  181.      r(bb,-1,0,'-');
  182.      r(bb,-1,1,'O');
  183.      r(bb,-1,2,'|');
  184.      r(bb,-2,1,'-'); }
  185.  }
  186.  
  187.  
  188. r(bb,dx,dy,ch)
  189.     struct bug (*bb);
  190.     char ch;
  191.  {    int tx,ty,direc,xdist,ydist;
  192.     char buf[4];
  193.     direc = ((*bb).Dir) & 03;
  194.  
  195.     if ((direc == 1) || (direc == 3))
  196.      { switch (ch) {
  197.         case '/':    ch = '\\'; break;
  198.         case '\\':    ch = '/'; break;
  199.         case '|':    ch = '-'; break;
  200.         case '-':    ch = '|'; break;
  201.         default:    break; }}
  202.  
  203.     switch (direc) {
  204.      case 0: tx = dx+(*bb).X; ty = dy+(*bb).Y; break;
  205.      case 2: tx = (*bb).X-dx; ty = (*bb).Y-dy; break;
  206.      case 1: tx = (*bb).X-dy; ty = (*bb).Y+dx; break;
  207.      case 3: tx = (*bb).X+dy; ty = (*bb).Y-dx; break; }
  208.     placech(ch,tx,ty); }
  209.  
  210.  
  211. placech(ch,tx,ty)
  212.     char ch;
  213.  {    int xdist,ydist;
  214.  
  215.     if ((tx<LEFT) || (tx>Right) || (ty<BOT) || (ty>Top)) return;
  216.  
  217.     xdist = CurX-tx; ydist = CurY-ty;
  218.     if (xdist<0) xdist = -xdist;
  219.     if (ydist<0) ydist = -ydist;
  220.     if ((ydist+xdist)>2)
  221.      { putchar('\033');
  222.        putchar('Y');
  223.        putchar(040 + Top - ty);
  224.        putchar(040 + tx);
  225.        CurX=tx; CurY=ty; }
  226.  
  227.     while (CurX<tx)
  228.      { putchar('\033'); putchar('C'); CurX++; }
  229.     while (tx<CurX)
  230.      { putchar('\033'); putchar('D'); CurX--; }
  231.     while (CurY<ty)
  232.      { putchar('\033'); putchar('A'); CurY++; }
  233.     while (ty<CurY)
  234.      { putchar('\033'); putchar('B'); CurY--; }
  235.     putchar(ch);
  236.     CurX++; }
  237.  
  238.  
  239. randbug(bb)
  240.     struct bug *bb;
  241.  {    int x,y,dir;
  242.      { dir = rand()%8;
  243.        x = rand()%80;
  244.        y = rand()%24;
  245.        if (Cflg)
  246.         { x = (Right-LEFT)/2; y = (Top-BOT)/2; }
  247.        else switch(dir & 03) {
  248.         case 0:    y=24+4; break;
  249.         case 2: y = -4; break;
  250.         case 1: x = -4; break;
  251.         case 3: x=80+4; break; }
  252.        mkbug(bb,x,y,dir); }}
  253.  
  254.  
  255. alive(bb)
  256.     struct bug *bb;
  257.  {    int px,py;
  258.     px = (*bb).X; py = (*bb).Y;
  259.     switch(((*bb).Dir) & 03) {
  260.      case 0: return(py>=BOT-4);
  261.      case 1: return(px<=Right+6);
  262.      case 2: return(py<=Top+4);
  263.      case 3: return(px>=LEFT-4); }}
  264.  
  265. turn(bb)
  266.     struct bug *bb;
  267.  {    switch ((*bb).State) {
  268.      case 0:    (*bb).State = 50; return;
  269.      case 20:    (*bb).State = 40; return;
  270.      default:    return; }}
  271.  
  272.  
  273. main(argc,argv)
  274.     char **argv;
  275.  {    int i,j,xdist,ydist,xmot,ymot;
  276.     char *arg;
  277.  
  278.     initw(XMotion, "0,1,0,-1,1,1,-1,-1");
  279.     initw(YMotion, "-1,0,1,0,-1,1,1,-1");
  280.     CurX = 1000; CurY = 1000;
  281.     Wflg = 0; Cflg = 0;
  282.     CBugs = 5;
  283.     Top = 23; Right = 78;
  284.  
  285.     srand1("Are you ready to be driven buggy? ");
  286.     getchar();
  287.  
  288.     for (i=1; i<argc; i++)
  289.      { arg = argv[i];
  290.        if (arg[0] == '-')
  291.         for (j=1; arg[j]; j++) switch(arg[j]) {
  292.       case 'W':    Wflg++; break;
  293.           case 'C':    Cflg++; break;
  294.           default:    printf("bugs: Illegal option\n",21); exit();}
  295.        else CBugs = atoi(arg); }
  296.     if (CBugs>NBUGS) CBugs=NBUGS;
  297.  
  298.     if (Wflg)
  299.      { for (i=LEFT; i<Right; i++) placech('-',i,Top);
  300.        for (i=Top; i>BOT; i--) placech('|',Right,i);
  301.        for (i=LEFT; i<Right; i++) placech('-',i,BOT);
  302.        for (i=Top; i>BOT; i--) placech('|',LEFT,i);
  303.      }
  304.  
  305.     puts("\33x5");    /* turn off cursor */
  306.  
  307.     for (i=0; i<CBugs; i++)
  308.      randbug(&bugs[i]);
  309.  
  310.     while(1)
  311.      {
  312.        if (bios(2)) if (bios(3) == CONTROL_C) 
  313.         exit(puts("\33y5\33E"));
  314.        i = rand()%CBugs;
  315.        if (alive(&bugs[i]))
  316.         { step(&bugs[i]);
  317.           j = (bugs[i]).State;
  318.           xmot = XMotion[(bugs[i]).Dir];
  319.           ymot = YMotion[(bugs[i]).Dir];
  320.           if ((j == 0) || (j == 20))
  321.             { if (Wflg) {
  322.               xdist = (bugs[i]).X;
  323.               ydist = xdist-Right;
  324.               if ((xmot>0) && (ydist<0) && (ydist*ydist < RADIUS2))
  325.                 turn(&bugs[i]);
  326.               ydist = xdist-LEFT;
  327.               if ((xmot<0)&&(ydist>0) && (ydist*ydist < RADIUS2))
  328.                 turn(&bugs[i]);
  329.               xdist = (bugs[i]).Y;
  330.               ydist = xdist-Top;
  331.               if ((ymot>0)&&(ydist<0) && (ydist*ydist < RADIUS2))
  332.                 turn(&bugs[i]);
  333.               ydist = xdist-BOT;
  334.               if ((ymot<0)&&(ydist>0) && (ydist*ydist < RADIUS2))
  335.                 turn(&bugs[i]); }}
  336.  
  337.           if ((j == 0) || (j == 20))
  338.            {    for (j=0;j<CBugs;j++)
  339.              { if (j==i) continue;
  340.                xdist = (bugs[j]).X - (bugs[i]).X;
  341.                ydist = (bugs[j]).Y - (bugs[i]).Y;
  342.                if ((xdist*xdist+ydist*ydist) < 21)
  343.                 { if (((xdist*xmot)<=0) && ((ydist*ymot)<=0))
  344.                     continue;
  345.                   turn(&bugs[i]);
  346.                   break; }}
  347.            if (!(rand()%15))
  348.               turn(&bugs[i]);}}
  349.        else randbug(&bugs[i]); }}
  350.